package com.sjb.thread;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: 有点儿意思
 * @Description:
 */
public class MyClass {

    // 实例方法
    public synchronized void instanceMethod(){
        System.out.println("Instance Method:"+ Thread.currentThread().getName());

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    // 静态方法
    public synchronized static void staticMethod(){
        System.out.println("Static Method:" + Thread.currentThread().getName());

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        MyClass obj1 = new MyClass();
        MyClass obj2 = new MyClass();

        // 两个线程同时调用同一个对象的实例方法  线程1 2 因为访问同一个实例方法而互斥
        new Thread(() -> obj1.instanceMethod(),"Thread 1").start();
        new Thread(() -> obj1.instanceMethod(),"Thread 2").start();

        // 两个线程调用不同对象的实例方法       线程3 4 因为访问不同的实例方法 而并行
        new Thread(() -> obj1.instanceMethod(),"Thread 3").start();
        new Thread(() -> obj2.instanceMethod(),"Thread 4").start();

        // 两个线程调用同一个类的静态方法       线程5 6在访问同一个类的静态方法也互斥
        new Thread(MyClass::staticMethod,"Thread 5").start();
        new Thread(MyClass::staticMethod,"Thread 6").start();
    }
}
